package Interfaces;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

import Auxiliary.Sequence_StateObserver;
import Store.StateObserver;

public class DividiStateObservers 
{

	ShowStateTablePart stateTablePart;
	DividiStateObservers self=null;
	JPanel pannelloPrincipale =null;
	JPanel PannelloCentrale =null;
	Vector<String> ListaSODisponibili = new Vector<String>();
	Vector<String> ListaSOScelti = new Vector<String>();
	Sequence_StateObserver allSO;

	public DividiStateObservers(ShowStateTablePart st)
	{
		stateTablePart=st;
	}
	public JPanel crea(Sequence_StateObserver allSO)
	{
		self=this;
		this.allSO=allSO;
		pannelloPrincipale= new JPanel();
		
		if(allSO!=null)
			for (StateObserver so : allSO.getAll()) 
				ListaSODisponibili.add(so.getName());
			
		
		pannelloPrincipale.setLayout(new BorderLayout());
		pannelloPrincipale.add(getpannelloNord(), BorderLayout.NORTH);
		pannelloPrincipale.add(getPannelloCentrale(), BorderLayout.CENTER);
		pannelloPrincipale.add(getpannelloSud(), BorderLayout.SOUTH);
		redisplay();
		
		return pannelloPrincipale;
	}
	private JLabel getpannelloNord() 
	{
		JLabel label = new JLabel("Divide the State Observers! (Click on the name to move)", JLabel.CENTER);
		return label;
	}
	
	
	JPanel getPannelloCentrale()
	{
		PannelloCentrale =new JPanel();
		PannelloCentrale.setLayout(new BorderLayout());
		PannelloCentrale.add(pannelloSODisponibili(), BorderLayout.WEST);
		PannelloCentrale.add(pannelloSOScelti(), BorderLayout.EAST);
		return PannelloCentrale;
	}
	
	JPanel getpannelloSud()
	{
		JPanel pannelloSud =new JPanel();

		JButton Button_Fatto = new JButton("Generate State Table");
		Button_Fatto.addActionListener(new ActionListener() 
		{
			@Override public void actionPerformed(ActionEvent e) 
			{
				Sequence_StateObserver lista = new Sequence_StateObserver();
				boolean controllo=false;
				if (ListaSOScelti.size()!=0)
					for (String nome : ListaSOScelti) 
						{lista.add(allSO.trova(nome)); allSO.trova(nome).getType().values();}
				for (StateObserver aux : lista.getAll())
				{
					if(!aux.getType().isFinite())
					{
						stateTablePart.showMessage(aux.getName().toUpperCase() +" Does not have finite type");
						controllo=true;
						break;
					}
				}
				if(!controllo){
				stateTablePart.container.removeAll();
				if (ListaSOScelti.size()==0)
					stateTablePart.showSTP();
				else
					stateTablePart.updateStateTable.selectUsedSO(lista);
			}}
		});
		JButton Button_Annulla = new JButton("Cancel");
		pannelloSud.setLayout(new GridLayout(1, 5));
		Button_Annulla.addActionListener(new ActionListener() 
		{
			@Override public void actionPerformed(ActionEvent e) 
			{
				stateTablePart.container.removeAll();
				stateTablePart.showSTP();
			}
		});
		
		pannelloSud.add(new JLabel(""));
		pannelloSud.add(Button_Fatto);
		pannelloSud.add(new JLabel(""));
		pannelloSud.add(Button_Annulla);
		pannelloSud.add(new JLabel(""));
		
		return pannelloSud;
	}
	
	JScrollPane pannelloSODisponibili()
	{
		JPanel SODisponibili=new JPanel();
		SODisponibili.setLayout(new GridLayout(20,1));
		JLabel label= new JLabel("Avable SO :                   ");
		label.setFont(new Font("Serif", Font.BOLD, 15));
		SODisponibili.add(label);
		if(ListaSODisponibili.size()==0)
			SODisponibili.add(new JLabel("No SO avable", JLabel.CENTER));
		else
			for(int i=0; i<ListaSODisponibili.size(); i++)
				SODisponibili.add(new LabelSwitcher().crea(ListaSODisponibili.get(i),self,true));
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.getViewport().add(SODisponibili);
		
		return scrollPane;
	}
	
	JScrollPane pannelloSOScelti(){
		JPanel SOScelti=new JPanel();
		SOScelti.setLayout(new GridLayout(20,1));
		JLabel label= new JLabel("Selected SO :                   ");
		label.setFont(new Font("Serif", Font.BOLD, 15));
		SOScelti.add(label);
		if(ListaSOScelti.size()==0)
			SOScelti.add(new JLabel("No SO selected", JLabel.CENTER));
		else
			for(int i=0; i<ListaSOScelti.size(); i++)
				SOScelti.add(new LabelSwitcher().crea(ListaSOScelti.get(i),self,false));

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.getViewport().add(SOScelti);
		
		return scrollPane;
	}
	
	public void redisplay()
	{
		pannelloPrincipale.remove(PannelloCentrale);
		pannelloPrincipale.add(getPannelloCentrale(), BorderLayout.CENTER);
		pannelloPrincipale.setVisible(true);
		pannelloPrincipale.revalidate();
	}
}

